﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DefensiveShield
{
    public static partial class OS
    {
        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- CONNECT CRYPTO DLL ---------
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция подключения динамической библиотеки шифрования
             * 
             * Данная функция подключает динамическую библиотеку, содержащую внутри себя функции шифрования и хеширования
             * 
            @return возвращает код ошибки
        */
        private static ErrorCodes ConnectCryptoDll()
        {
            // I believe that working with dll will consist of 3 parts: connect to dll, use function from dll, close connection with dll
            // If I am right, then you must implement two more functions - connect and disconnect crypto dll
            // I believe that you also will have to create some small structure for saving info about openned dll - just place it in this class in the beginning of this file

            return ErrorCodes.NoError;
        }

        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- DISCONNECT CRYPTO DLL ------
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция отключени от динамической библиотеки шифрования
             * 
             * Данная функция отключает динамическую библиотеку, содержащую внутри себя функции шифрования и хеширования
             * 
            @return возвращает код ошибки
        */
        private static ErrorCodes DisconnectCryptoDll()
        {
            return ErrorCodes.NoError;
        }

        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- HASH -----------------------
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция генерации ключа шифрования
             * 
             * Данная функция подключает динамическую библиотеку, содержащую функцию генерации ключа шифрования и выполняет генерацию
             * 
            @return string - ключ шифрования
        */
        public static string GenerateKey()
        {
            // Here you must connect to dll and use GenerateKey function from there

            return "This is the key! You silly, girl!";
        }

        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- HASH -----------------------
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция хеширования
             * 
             * Данная функция подключает динамическую библиотеку, содержащую функцию хеширования и выполняет хеширование при необходимости
             * 
            @return string - хеш строки
            @return null - в случае ошибки
        */
        public static string Hash(string str)
        {
            // Here you must connect to dll and use hash function from there
            
            return str;
        }

        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- ENCRYPT --------------------
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция шифрования
             * 
             * Данная функция используя динамическую библиотеку, содержащую функцию шифрования, шифрует строку на заданном ключе
             * 
            @return string - зашифрованную строку
            @return null - в случае ошибки
        */
        public static string Encrypt(string str, string key)
        {
            // Here you must connect to dll and use encrypt function from there
            // If dll encrypt function is not making base64 encode for its reply, then you must by yourself make it

            return str;
        }

        //---------------------------------------------------------------------------------------------------------------------------------
        //---------------------------------------------------------------------------------------------------- DECRYPT --------------------
        //---------------------------------------------------------------------------------------------------------------------------------
        /**
            @brief Функция дешифрования
             * 
             * Данная функция используя динамическую библиотеку, содержащую функцию дешифрования, дешифрует строку на заданном ключе
             * 
            @return string - расшифрованную строку
            @return null - в случае ошибки
        */
        public static string Decrypt(string str, string key)
        {
            // Here you must connect to dll and use decrypt function from there
            // If dll decryption function is not making base64 encode for its reply, then you must by yourself make it

            return str;
        }
    }
}
